﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OT.HikiSecureCenterApis.Service.OneCard
{
    /// <summary>
    /// 一卡通应用服务 --> 访客管理
    /// </summary>
    public partial class OneCardService
    {
        #region 预约接口
        /// <summary>
        /// 访客预约v2 /api/visitor/v2/appointment
        /// 本接口用于为访客提供预约的能力，预约成功后，每个访客都有独立的验证码和二维码本接口支持访客信息的自定义字段，按照属性定义key:value上传到访客信息列表：
        /// visitorInfoList中即可， 通过获取访客基础信息字段接口获取平台已支持访客自定义属性的说明。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorAppointmentAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v2/appointment", 1.4, req);
        /// <summary>
        /// 预约免登记 /api/visitor/v1/appointment/registration
        /// 本接口提供在完成访客预约操作后，为访客下发默认权限组的权限和入参“visitorPermissionSet”指定的权限组集合的能力，本接口支持上传人脸照片，
        /// 提供人脸权限下载的能力。预约免登记操作后的记录状态为正常或者迟到，当访客进行园区后，访客管理应用服务组件收到访客相关的刷卡、刷脸事件、
        /// 车辆出入事件后将访客记录状态改为已到达或者超期未签离，完成访客自动登记流程操作。如果接口指定了权限组，则按指定的权限组进行权限下发，否则按照默认权限组进行权限下发；
        /// 预约免登记接口创建的预约记录支持预约记录的修改、取消和登记操作。但修改操作只能对访客的基本信息进行修改，不能对访客的权限信息进行修改。
        /// 修改操作使用修改访客预约v2接口，取消操作使用取消访客预约；如果访客到访，但还未进行任何的刷卡、刷脸事件、车辆出入操作，则可以对该预约免登记记录进行登记接口，
        /// 如果访客产生了刷卡、刷脸事件、车辆出入操作，则访客管理应用服务会自动进行登记操作，接口应用方将不能进行登记操作。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorAppointmentRegistrationAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/appointment/registration", 1.3, req);
        /// <summary>
        /// 修改访客预约v2 /api/visitor/v2/appointment/update
        /// 根据访客预约v2接口返回的预约记录ID作为唯一标识，来修改访客的预约信息。
        /// 可修改的信息包括被访人、预计来访时间、预计离开时间、来访事由，以及访客的详细信息。
        /// 修改访客预约信息的处理原则是先删除原有的访客信息，然后添加更新的访客信息，所以会重新生成新的访客ID，但是预约记录ID保持不变。
        /// 注：当某个被访人有多个访客，但只需要修改其中一个访客信息时，基于修改访客预约v2接口的删除再添加的原则，需要对这个被访人的所有访客进行重新预约。
        /// 修改的访客预约记录必须有效，即预约记录ID真实存在，且对应的预约状态是正常或者迟到的任何一种，其中正常状态，表示访客还没登记，且预计来访时间晚于当前时间，迟到状态，表示访客还没登记，预计来访时间早于当前时间，且预计离开时间晚于当前时间。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorAppointmentUpdateAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v2/appointment/update", 1.3, req);
        /// <summary>
        /// 取消访客预约 /api/visitor/v1/appointment/cancel
        /// 该接口用于对访客预约记录进行取消操作。可用于取消访客预约的记录状态有：正常、迟到。失效的预约记录不能取消。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorAppointmentCancelAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/appointment/cancel", 1.2, req);
        /// <summary>
        /// 查询访客预约记录v2 /api/visitor/v2/appointment/records
        /// 该接口用于查询预约记录，可以根据查询条件：被访人唯一标识、预计来访时间范围、预计离开时间范围、访客联系电话、预约记录ID、访客验证码等条件进行组合查询。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorAppointmentRecordsAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v2/appointment/records", 1.4, req);
        #endregion

        #region 登记签离接口
        /// <summary>
        /// 已预约登记 /api/visitor/v1/order/register
        /// 该接口主要是应用于对已预约的访客进行登记和授权。当访客已经预约时，访客管理应用服务组件可以通过访客到访时提供的二维码、
        /// 验证码等信息调用查询访客预约记录v2接口获取访客的预约信息，然后根据预约Id等信息调用本接口实现访客的登记与权限授予操作。
        /// 该接口的权限授予功能依赖于“查询访客权限组”接口，用户需要先在访客管理应用服务中配置好访客权限组。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorOrderRegisterAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/order/register", 1.3, req);
        /// <summary>
        /// 未预约登记 /api/visitor/v1/orderless/register
        /// 该接口提供对访客进行直接登记和授权的能力，当访客没有预约就直接到访的情况下，允许接口调用方通过该接口实现对访客进行直接登记和权限授予。
        /// 该接口的权限授予功能依赖于“查询访客权限组”接口，用户需要先在访客管理应用服务中配置好访客权限组。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorOrderlessRegisterAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/orderless/register", 1.3, req);
        /// <summary>
        /// 访客登记修改 /api/visitor/v1/order/update
        /// 本接口提供修改访客登记信息能力。本接口支持访客信息的自定义字段，按照属性定义key:value上传到访客信息列表：
        /// visitorInfoList中即可， 通过获取访客基础信息字段接口获取平台已支持访客自定义属性的说明。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorOrderUpdateAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/order/update", 1.4, req);
        /// <summary>
        /// 访客签离 /api/visitor/v1/visitor/out
        /// 该接口用于对访客进行签离操作和取消授权。访客离开时可通过本接口对访客进行签离操作，同时清除访客登记时为访客授予的全部权限。
        /// 当然，如果访客离开时未进行签离操作，访客管理应用服务组件也会在访客预计离开时间的后一天对该访客进行自动签离并取消权限。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorOutAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/visitor/out", 1.3, req);
        #endregion

        #region 查询接口
        /// <summary>
        /// 查询访客来访记录v2 /api/visitor/v2/visiting/records
        /// 访客来访记录指访客登记后的访客信息，访客预约记录在访客机上完成登记操作，就会变成访客来访记录。
        /// 查询访客来访记录接口支持分页查询，可以根据查询条件：访客姓名、被访人、来访时间、离开时间、访客联系电话、访客记录ID、访客状态进行组合查询，
        /// 接口需要传入用户登录名，用于权限过滤。其中访客姓名、被访人姓名、证件号码和联系电话支持模糊查询。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitingRecordsAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v2/visiting/records", 1.3, req);
        /// <summary>
        /// 查询访客权限下载记录 /api/visitor/v1/auth/result
        /// 该接口用于查询访客的权限下载记录。当访客登记完成后或者完成签离后，可以通过该接口查询访客权限的下载（或者取消）结果，
        /// 如果存在权限下载失败的记录，可以通过访客权限重新下发接口实现对该访客的权限进行重新下发。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorAuthResultAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/auth/result", 1.3, req);
        /// <summary>
        /// 获取访客记录中的图片 /api/visitor/v1/record/pictures
        /// 获取访客记录中的图片
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorRecordPicturesAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/record/pictures", 1.0, req);
        /// <summary>
        /// 查询访客出入事件 /api/visitor/v1/event/turnover/search
        /// 本接口支持通过访客id,姓名,事件时间,来访时间，门禁点等资源信息查询访客出入事件,并且返回数据中补全访客信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorEventTurnoverSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/event/turnover/search", 1.4, req);
        #endregion

        #region 访客黑名单
        /// <summary>
        /// 添加访客黑名单分组 /api/visitor/v1/blackList/add
        /// 添加黑名单分组信息，用于配置黑名单人员信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorBlackListAddAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/blackList/add", 1.5, req);
        /// <summary>
        /// 查询访客黑名单分组 /api/visitor/v1/blackList/search
        /// 查询已添加的黑名单分组数据，返回黑名单分组相关信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorBlackListSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/blackList/search", 1.4, req);
        /// <summary>
        /// 修改访客黑名单分组 /api/visitor/v1/blackList/update
        /// 修改已添加的黑名单分组数据，支持修改黑名单分组名称，注意修改后的分组名称不能与已存在的分组名称重复。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorBlackListUpdateAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/blackList/update", 1.5, req);
        /// <summary>
        /// 删除访客黑名单分组 /api/visitor/v1/blackList/delete
        /// 支持删除已添加的黑名单分组数据。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorBlackListDelAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/blackList/delete", 1.5, req);
        /// <summary>
        /// 查询访客黑名单分组中人员数据 /api/visitor/v1/blackList/person/search
        /// 查询已添加的黑名单分组中的人员数据，返回黑名单人员相关信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorBlackListPersonSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/blackList/person/search", 1.5, req);
        /// <summary>
        /// 访客黑名单分组中配置人员数据 /api/visitor/v1/blackList/person/set
        /// 向黑名单分组中添加或删除人员数据。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> VisitorBlackListPersonSetAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/visitor/v1/blackList/person/set", 1.5, req);
        #endregion

        #region 其他辅助接口
        /// <summary>
        /// 生成访客动态二维码内容 /api/resource/v2/ecsDevice/search
        /// 该接口用于查询访客的动态二维码内容，应用方可以获取该二维码内容，然后生成二维码图片，最后使用该二维码在门禁等设备上签权或者使用该二维码查询访客信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> EcsDeviceSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/resource/v2/ecsDevice/search", 1.4, req);
        /// <summary>
        /// 查询梯控控制器列表v2 /api/resource/v2/ecsDevice/search
        /// 根据条件查询目录下有权限的梯控控制器列表。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> EcsDeviceSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/resource/v2/ecsDevice/search", 1.4, req);
        /// <summary>
        /// 查询梯控控制器列表v2 /api/resource/v2/ecsDevice/search
        /// 根据条件查询目录下有权限的梯控控制器列表。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> EcsDeviceSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/resource/v2/ecsDevice/search", 1.4, req);
        /// <summary>
        /// 查询梯控控制器列表v2 /api/resource/v2/ecsDevice/search
        /// 根据条件查询目录下有权限的梯控控制器列表。
        /// 当返回字段对应的值为空时，该字段不返回。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResEcsDevice"/></returns>
        public async Task<ResParameter<ResPageData<ResEcsDevice>>?> EcsDeviceSearchAsync(ReqSearch req) =>
          await SecureCenterApis.PostAsync<ResPageData<ResEcsDevice>>("/api/resource/v2/ecsDevice/search", 1.4, req);
        #endregion
    }
}
